class Node {
    constructor(value, next = null) {
        this.value = value;
        this.next = next;
    }
}

class LinkList {
    constructor() {
        this.head = null; //头节点
        this.length = 0; //链表长度
    }
    //在链表的末尾添加节点
    appendEndNode(value) {
        const node = new Node(value);
        if (!this.head) {
            this.head = node;
        } else {
            let current = this.head;
            while (current.next) { //如果当前节点有next,则继续遍历,一直到最后一个节点指向null为止
                current = current.next;
            }
            current.next = node; //将最后一个节点的next指向新添加的节点
        }
        this.length++;
    };
    //在链表的头部添加节点
    appendFirstNode(value) {
        //这里无需判断链表是否为空,因为如果为空,则head为null,则node.next = null,不会影响链表的结构
        const node = new Node(value);
        node.next = this.head;
        this.head = node;
        this.length++;
    }
    //移除链表的第一个节点
    removeFirstNode() {
        if (!this.head) {
            return null; //如果链表为空,则返回空
        }
        const value = this.head.value;
        this.head = this.head.next;
        this.length--;
        return value; //将移除的值返回出去
    }
    //移除链表的最后一个节点
    removeLastNode() {
        if (!this.head) {
            return null; //如果链表为空,则返回空
        }
        let current = this.head;
        let previous = null;
        while (current.next) {
            previous = current;
            current = current.next;
        }
        const value = current.value;
        previous.next = null;
        this.length--;
        return value; //将移除的值返回出去
    }
    //移除指定值且指定第几个该值的节点
    removeNodeByValueAndIndex(value, index) {
        if (!this.head) {
            return null; //如果链表为空,则返回空
        }
        let current = this.head; //记录链表的头节点
        let currentIndex = 0; //记录找到目标的顺序,从1开始
        let previous = null; //记录前一个节点
        while (current) {
            if (current.value === value) { //如果当前节点的值等于目标值
                currentIndex++;
                if (currentIndex === index) { //如果找到目标的顺序等于index,则移除该节点
                    console.log('找到了', currentIndex, value, previous,current);
                    let next = current.next;
                    previous.next = next;
                    this.length--;
                    return value; //将移除的值返回出去
                }
            }
            previous = current; //记录前一个节点
            current = current.next; //如果当前节点的值不等于目标值,则继续遍历
        }
        return null; //如果遍历完链表都没有找到目标值,则返回空
    }
    //查找指定值的节点
    findNodeByValue(value) {
        let current = this.head;
        let currentIndex = 0; //记录找到目标的顺序,从1开始
        while (current) {
            if (current.value === value) { //如果当前节点的值等于目标值
                return { currentIndex, value }; //将找到目标的顺序和值返回出去
            }
            current = current.next; //如果当前节点的值不等于目标值,则继续遍历
            currentIndex++;
        }
        return null; //如果遍历完链表都没有找到目标值,则返回空
    }
}



//测试

let myLinkList = new LinkList();
myLinkList.appendEndNode(1);
myLinkList.appendEndNode(2);
myLinkList.appendEndNode(3);
myLinkList.appendEndNode(4);
myLinkList.appendEndNode(5);
myLinkList.appendEndNode(6);
myLinkList.appendEndNode(7);
myLinkList.appendEndNode(8);
myLinkList.appendEndNode(9);
myLinkList.appendEndNode(6);
myLinkList.appendEndNode(10);

// 查找指定值的节点
console.log(myLinkList.findNodeByValue(1));
console.log(myLinkList.findNodeByValue(2));

// 在链表的头部添加节点
myLinkList.appendFirstNode(0);
console.log(myLinkList.findNodeByValue(0));

// 移除链表的第一个节点
myLinkList.removeFirstNode();
console.log(myLinkList.findNodeByValue(0));
// 移除链表的最后一个节点
myLinkList.removeLastNode()
console.log(myLinkList.findNodeByValue(10));

// 在尾部添加节点
myLinkList.appendEndNode(10)
console.log(myLinkList.findNodeByValue(10));

//删除指定顺序和指定值的节点
console.log(myLinkList.removeNodeByValueAndIndex(6, 1));
console.log(myLinkList.findNodeByValue(6));





